#ifndef __GAF_MEDIA_H__
#define __GAF_MEDIA_H__

namespace GAF
{
	struct MediaTransfer;
	//class Runnable
		//class Player
			class Media;
}
typedef GAF::MediaTransfer			GAF_SMediaTransfer;
typedef GAF::Media				GAF_CMedia;

namespace GAF
{
	enum MediaDoing
	{
		MEDIA_QUERYING,			// 查询
		MEDIA_PLAYING,			// 播放
		MEDIA_PAUSEING,			// 暂停
		MEDIA_STOPPING,			// 停止

	};
	typedef bool				(*MediaPlayerFun)(GAF_SMediaTransfer& mi);
}
typedef GAF::MediaDoing				GAF_EMediaDoing;
#define GAF_MEDIA_QUERYING			GAF::MEDIA_QUERYING
#define GAF_MEDIA_PLAYING			GAF::MEDIA_PLAYING
#define GAF_MEDIA_PAUSEING			GAF::MEDIA_PAUSEING
#define GAF_MEDIA_STOPPING			GAF::MEDIA_STOPPING


#include "GAF_Define.h"
#include "GAF_Player.h"
#include "GAF_Bundle.h"

#define GAF_MEDIA_CHANNEL_FREE			-1

namespace GAF
{
	struct MediaTransfer
	{
		_IN	GAF_EMediaDoing		doing;		// 媒体执行动作
		_IN_OUT	STD_STRING		file;		// 媒体文件
		_IN_OUT	bool			loop;		// 循环
		_IN_OUT	char			channel;	// 声道
		_IN_OUT	BYTE			volume;		// 音量
		_IN	GAF_DTimeTicks		jump;		// 跳转

		_OUT	GAF_EPlayerState	state;		// 媒体状态
		_OUT	GAF_DTimeTicks		timetotal;	// 总时间
		_OUT	GAF_DTimeTicks		timecurrent;	// 当前播放时间
	};

	/// 媒体基类
	class _ABSTRACT Media : public Player
	{
	public:
		static MediaTransfer	GetMediaTransfer();
		static bool		DefaultAudioPlayer(_IN_OUT GAF_SMediaTransfer& mi);

	public:
		Media();
		virtual ~Media();

	public:
		bool			Init(STD_STRING strMediaFile, MediaPlayerFun mpfUsing = DefaultAudioPlayer);

	protected:
		virtual bool		OnInit(STD_STRING strMediaFile) = 0;

	protected:
		bool			MediaPlayer(_IN_OUT GAF_SMediaTransfer& mi);

	protected:
		MediaPlayerFun		m_mpfUsing;

// 继承
// 		// 定义操作
// 	protected:
// 		// 播放操作
// 		virtual bool		Playing(GAF_CBundle* pbdlParam)
// 					{return true;}
// 		// 运行操作
// 		virtual bool		Running(TimeTicks ttUsed, bool& isFinish)
// 					{return true;}
// 		// 暂停操作
// 		virtual bool		Pauseing()
// 					{return true;}
// 		// 完成操作
// 		virtual bool		Finishing()
// 					{return true;}
// 		// 停止操作
// 		virtual bool		Stopping()
// 					{return true;}
// 
// 		// 定义事件
// 	protected:
// 		// 当播放时
// 		virtual bool		OnPlay(GAF_CBundle* pbdlParam)
// 					{return true;}
// 		// 当播放更新时
// 		virtual bool		OnUpdate(TimeTicks ttUsed)
// 					{return true;}
// 		// 当播放暂停时
// 		virtual bool		OnPause()
// 					{return true;}
// 		// 当完成一次播放时
// 		virtual bool		OnFinish()
// 					{return true;}
// 		// 当播放停止时
// 		virtual bool		OnStop()
// 					{return true;}
	};
}

#endif
